home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / rip_poison.nasl < prev    next >
Text File  |  2005-03-31  |  4KB  |  151 lines

  1. # This plugin was written from scratch by Michel Arboi <arboi@alussinan.org>
  2. # with help from Pavel Kankovsky.
  3. #
  4. # It is released under the GNU Public Licence (GPLv2)
  5. #
  6. # References:
  7. # RFC 1058    Routing Information Protocol
  8. # RFC 2453    RIP Version 2
  9. #
  10. # Notes:
  11. # routed from OpenBSD or Linux rejects routes that are not sent by a neighbour
  12.  
  13. if(description)
  14. {
  15.   script_id(11829);
  16.   script_version ("$Revision: 1.9 $");
  17.  
  18.   name["english"] = "RIP poisoning";
  19.   script_name(english:name["english"]);
  20.  
  21.   desc["english"] = "
  22. It was possible to poison the remote host routing tables through
  23. the RIP protocol.
  24. An attacker may use this to hijack network connections.
  25.  
  26. Solution : use RIP-2 and implement authentication, 
  27.     or use another routing protocol,
  28.     or disable the RIP listener if you don't need it.
  29.  
  30. Risk factor : Low";
  31.  
  32.   script_description(english:desc["english"]);
  33.  
  34.   summary["english"] = "Poison routing tables through RIP";
  35.   script_summary(english:summary["english"]);
  36. # This plugin is not supposed to be dabgerous but it was released as 
  37. # ACT_DESTRUCTIVE_ATTACK because we could not be 100% sure that there 
  38. # were no really broken RIP implementation somewhere in the cyberspace. 
  39. # Looks OK now.
  40.   script_category(ACT_ATTACK);
  41.   script_copyright(english:"This script is Copyright (C) 2003 Michel Arboi");
  42.   family["english"] = "Misc.";
  43.   family["francais"] = "Divers";
  44.   script_family(english:family["english"], francais:family["francais"]);
  45.   script_dependencie("rip_detect.nasl");
  46.   script_require_keys("Services/udp/rip");
  47.   exit(0);
  48. }
  49.  
  50. ##include("dump.inc");
  51.  
  52. port = get_kb_item("Services/udp/rip");
  53. if (! port) port = 520;
  54.  
  55. #if (! get_udp_port_state(port)) exit(0); # Not very efficient with UDP!
  56.  
  57. a1 = 192; a2 = 0; a3 = 34; a4 =  166;    # example.com
  58.  
  59. function check_example_com()
  60. {
  61.   local_var    r, l, ver, i, soc, broken; 
  62.   
  63.   broken = get_kb_item("/rip/" + port + "/broken_source_port");
  64.   if (broken)
  65.     soc = open_priv_sock_udp(dport:port, sport:port);
  66.   else
  67.     soc = open_sock_udp(port);
  68.   if (!soc) return(0);
  69.  
  70.   # Special request - See º3.4.1 of RFC 1058
  71.   req = raw_string(1, 1, 0, 0, 0, 0, 0, 0, 
  72.         0, 0, 0, 0,
  73.         0, 0, 0, 0,
  74.         0, 0, 0, 0,
  75.         0, 0, 0, 16);
  76.   send(socket: soc, data: req);
  77.   r = recv(socket:soc, length: 512);
  78.   ##dump(ddata: r, dtitle: "routed");
  79.  
  80.   close(soc);
  81.   l = strlen(r);
  82.   if (l < 4 || ord(r[0]) != 2) return (0);    # Not a RIP answer
  83.   ver = ord(r[1]); 
  84.   if (ver != 1 && ver != 2) return (0);    # Not a supported RIP version?
  85.  
  86.   for (i = 4; i < l; i += 20)
  87.   {
  88.     fam = 256 * ord(r[i]) + ord(r[i+1]);
  89.     if (fam == 2)
  90.       if (ord(r[i+4]) == a1 && ord(r[i+5]) == a2
  91.     && ord(r[i+6]) == a3  && ord(r[i+7]) == a4 # Addr
  92. # We ignore route which have 'infinite' length
  93.     && ord(r[i+16]) == 0 && ord(r[i+17]) == 0 
  94.     && ord(r[i+18]) == 0 && ord(r[i+19]) != 16) # Hops
  95.         return 1;
  96.   }
  97.   return 0;
  98. }
  99.  
  100. if (check_example_com()) exit(0);    # Routing table is weird
  101.  
  102. soc = open_priv_sock_udp(sport: 520, dport: 520);
  103. if (! soc) exit(0);
  104.  
  105.  
  106. req = raw_string(2, 1, 0, 0, 
  107.         0, 2, 0, 0, 
  108.         a1, a2, a3, a4,
  109.         0, 0, 0, 0,
  110.         0, 0, 0, 0,
  111.         0, 0, 0, 14);    # Hops - limit the propagation of the bogus route
  112. # Maybe we should use the result of traceroute to set the right number?
  113.  
  114. send(socket: soc, data: req);
  115. ##close(soc);
  116.  
  117. if (check_example_com())
  118. {
  119.   security_hole(port: port, protocol: "udp");
  120.   if (! islocalnet())
  121.     security_hole(port: port, protocol: "udp", 
  122. data: "Your RIP listener accepts routes that are not sent by a neighbour.
  123. This cannot happen in the RIP protocol as defined by RFC2453, and 
  124. although the RFC is silent on this point, such routes should probably 
  125. be ignored.
  126.  
  127. A remote attacker might use this flaw to access your local network, if
  128. it is not protected by a properly configured firewall.
  129.  
  130. Solution : reconfigure your RIP listener if possible
  131.     or use another routing protocol,
  132.     or disable the RIP listener if you don't need it.
  133.  
  134. Risk factor : High");
  135.  
  136. # Fix it: set the number of hops to "infinity".
  137.  
  138.   req = raw_string(2, 1, 0, 0, 
  139.         0, 2, 0, 0, 
  140.         a1, a2, a3, a4,
  141.         0, 0, 0, 0,
  142.         0, 0, 0, 0,
  143.         0, 0, 0, 16);    # Hops
  144.   send(socket: soc, data: req);
  145. }
  146.  
  147. close(soc);
  148.  
  149. ##if (! check_example_com()) display("Fixed!\n");
  150.